#include "mywidget.h"
#include "server.h"


#include <QDebug>
Server::Server(QObject *parent): QTcpServer(parent)
{
    //动态转换窗口类，下行转换
    m_widget=dynamic_cast<Widget *>(parent);
}
Server::~Server()
{

}
/*
* 参数：sockDesc:套接字的描述符
* 功能：有套接字建立时，自动调用此函数，
* 注：  重写incomingConnection时，它的参数必须设置为qintptr类型，而不能是int型（会无法触发incomingconnection函数 ）
*/
void Server::incomingConnection(qintptr sockDesc)
{
    qDebug()<<"new connection"<<sockDesc;
    Tcpthread *m_thread=new Tcpthread(sockDesc,0);//创建线程
    connect(m_thread,SIGNAL(dataReady(const QString &)),this,SLOT(recvBuffer(const QString &)));            //解析数据
    connect(m_thread,SIGNAL(connectTCP(QString,int)),m_widget,SLOT(connectState(QString,int)));
    connect(m_thread,SIGNAL(disconnectTCP(int)),m_widget,SLOT(disconnectState(int)));
    connect(m_thread,SIGNAL(disconnectTCP(int)),m_thread,SLOT(deleteLater()),Qt::DirectConnection);         //避免内存泄漏

    connect(m_widget,SIGNAL(serverDisconnect()),m_thread,SLOT(disconnectServer()));
    connect(m_widget,SIGNAL(sentData(const QByteArray&)),m_thread,SLOT(sendDataSlot(const QByteArray&)));//写数据关联

    m_thread->start();
}
/*
* 参数：data:数据
* 功能：对收到的数据进行解析，并把解析完的数据放入QStringList容器，数据的格式为"%f,%f,%f..."
*/
void Server::recvBuffer(const QString &data)
{
    QMutexLocker locker(&mutex);
    //以逗号分隔收到的数据
    QStringList tmpList=data.split(",");
    float tmp;
    bool ok;
    int  count=tmpList.size();
    for(int i=0;i<count;i++)
    {
        //缓冲区的数据少于100000个，且解析的数据非空
        if((recv_buffer.size()<=100000)&&(tmpList.at(i).isEmpty()==false))
        {
            //判断能够将收到的数据转换为数字格式，如果能则把它放入容器
            tmp=tmpList.at(i).toFloat(&ok);
            if(ok)
            recv_buffer<<tmp;
        }
    }

//        qDebug()<<"data:"<<data;
}
